package handler

import (
	"fmt"
	"net/http"
	
	"gitee.com/li-zhenyi/yi-nian-zhi-jian/backend/internal/service"
	"github.com/gin-gonic/gin"
)

// ItemHandler 处理物品相关请求的控制器
// 这个结构体持有itemService接口，用于调用物品相关业务逻辑
type ItemHandler struct {
	itemService service.ItemService
}

// NewItemHandler 创建一个新的物品控制器实例
// 参数itemService是物品服务接口，用于注入依赖
func NewItemHandler(itemService service.ItemService) *ItemHandler {
	return &ItemHandler{
		itemService: itemService,
	}
}

// GetInventory 处理获取用户物品列表的请求
// GET /api/v1/game/inventory
func (h *ItemHandler) GetInventory(c *gin.Context) {
	// TODO: 在实际项目中，这里应该从JWT令牌中获取用户ID
	userId := int64(1)
	
	// 调用Service层获取物品列表
	inventory, err := h.itemService.GetInventory(userId)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code": 400,
			"message": "获取物品列表失败",
			"error": err.Error(),
		})
		return
	}
	
	// 准备返回数据
	// 这里我们需要转换数据格式，因为前端期望的格式可能与后端模型不完全一致
	var responseData []map[string]interface{}
	for _, userItem := range inventory {
		itemData := map[string]interface{}{
			"id":          userItem.ID,
			"item_id":     userItem.ItemID,
			"name":        userItem.Item.Name,
			"type":        userItem.Item.Type,
			"description": userItem.Item.Description,
			"effect":      userItem.Item.Effect,
			"quantity":    userItem.Quantity,
		}
		responseData = append(responseData, itemData)
	}
	
	// 返回物品列表
	c.JSON(http.StatusOK, gin.H{
		"code": 0,
		"message": "success",
		"data": responseData,
	})
}

// UseItem 处理使用物品的请求
// POST /api/v1/game/item/use
func (h *ItemHandler) UseItem(c *gin.Context) {
	// TODO: 在实际项目中，这里应该从JWT令牌中获取用户ID
	userId := int64(1)
	
	// 定义请求体结构体
	type UseItemRequest struct {
		ItemID string `json:"itemId" binding:"required"` // 物品ID
	}
	
	var req UseItemRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code": 400,
			"message": "参数验证失败",
			"error": err.Error(),
		})
		return
	}
	
	// 将字符串类型的物品ID转换为int64
	itemID, err := parseItemID(req.ItemID)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code": 400,
			"message": "物品ID格式不正确",
			"error": err.Error(),
		})
		return
	}
	
	// 调用Service层处理使用物品逻辑
	message, err := h.itemService.UseItem(userId, itemID)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code": 400,
			"message": "使用物品失败",
			"error": err.Error(),
		})
		return
	}
	
	// 返回使用结果
	c.JSON(http.StatusOK, gin.H{
		"code": 0,
		"message": message,
		"data": map[string]interface{}{
			"success": true,
		},
	})
}

// parseItemID 将字符串类型的物品ID转换为int64
func parseItemID(idStr string) (int64, error) {
	// 这里简单处理，实际项目中可能需要更复杂的逻辑
	// 比如处理UUID或其他格式的ID
	var id int64
	_, err := fmt.Sscanf(idStr, "%d", &id)
	return id, err
}